<?php
/**
 * Controller_Direction
*
* Класс Controller_Direction отвечает за обработку страниц набора "Наши направления"
*
*/
class Controller_Direction extends Controller_Base { 
	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
		$this->addCrumb('Главная', W_ABSPATH);
		$objFederalDistrict = new FederalDistrict();
		$objFederalDistrict->find('first', array('conditions' => "`federal_district`.`federal_district_url`='" . $this->arrRequest[0] . "'"));
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		switch ($this->arrRequest[0]) {
			case 'directions':
				$this->actionList();
			  break;
			case 'routes':
			  	if(!$this->arrRequest[1]) echo 1;
			  	else { // Проверяем на страницу конкретного маршрута
			  		$arrUrl = explode('-', $this->arrRequest[1]);
			  		if(count($arrUrl) != 2) throw new Exception_SiteError('', 404);		// Если url не вида строка - строка, то выходим
			  		
			  		// Пытаемся получить айдишники городов, учитывая, что по правилам первый город в урле маршрута должен быть больше по полю city_type либо city_type одинаковое, но city_url первого меньше(например SAMara - SAHara)
			  		$objCity = new City();
					$citiesArray = $objCity->find('all', array(
						'select' => '
							`city`.`ID_city`,
							`city`.`city_name`,
							`city`.`city_type`,
							`city`.`importance_level`,
							`city`.`city_url`,
							`city`.`ID_federal_district`,
							`city`.`population`
						', 
						'conditions' => "`city`.`city_url`='" . $arrUrl[0] . "' OR `city`.`city_url`='" .  $arrUrl[1] . "'", 
						'order' => '`city`.`city_type` DESC, `city`.`city_url`'
					));
			  		
					if(count($citiesArray) != 2) throw new Exception_SiteError('', 404);				// Если хоть один город не нашёлся - выходим
			  		if($citiesArray[0]['city_url'] == $arrUrl[1]) User_Session::moveTo(W_ABSPATH . 'routes/' . $arrUrl[1] . '-' . $arrUrl[0], 'Маршрут введён наоборот', 1);			// Если url'ы верные, но введены наоборот - редиректим на правильную страницу
			  		
			  		$routeArray = Route::getRouteArrayByIds($citiesArray[0]['ID_city'], $citiesArray[1]['ID_city']);
			  		if(empty($routeArray)) throw new Exception_SiteError('', 404);		// Если не получен массив маршрута, значит невеный url(либо в БД нет маршрута для заданных городов - соотв alert???) - выходим
			  		
			  		$this->actionRoutePage($routeArray, $citiesArray);
			  	}
			  	break;
			case 'traffic':	// Старые страницы traffic
					if($this->arrRequest[1]) {
						$cityUrl = str_replace('.htm', '', $this->arrRequest[1]);
						$objCity = new City();
						$cityArray = $objCity->find('first', array('select' => '`city`.`city_url`, `federal_district`.`federal_district_url`', 'joins' => 'INNER JOIN `federal_district` USING(`ID_federal_district`)','conditions' => "`city`.`city_url`='" . $cityUrl . "'"));
						if(!empty($cityArray)) User_Session::moveTo(W_ABSPATH . $cityArray['federal_district_url'] . '/' .  $cityArray['city_url'], 'Редирект со старого урла(traffic)', 1);
						else throw new Exception_SiteError('', 404);
					}
					else throw new Exception_SiteError('', 404);
				break;
			default:
				
				// Проверяем не перешли ли по старому урлу федерального округа
					$oldFOUrls = array (
						'tsentralnyiy_federalnyiy_okrug' => 'tsfo', 
						'yujnyiy_federalnyiy_okrug' => 'yufo',
						'severo_zapadnyiy_federalnyiy_okrug' => 'szfo',
						'dalnevostochnyiy_federalnyiy_okrug' => 'dfo',
						'sibirskiy_federalnyiy_okrug' => 'sfo',
						'uralskiy_federalnyiy_okrug' => 'ufo',
						'privoljskiy_federalnyiy_okrug' => 'pfo',
						'severo_kavkazskiy_federalnyiy_okrug' => 'skfo'
					);
					foreach($oldFOUrls as $oldUrl => $newUrl) {
						if ($this->arrRequest[0] == $oldUrl) { // Если урл один из старых
							if(!$this->arrRequest[1])  User_Session::moveTo(W_ABSPATH . $newUrl, 'Редирект со старого урла, главная старница ФО', 1);
							elseif($this->arrRequest[1] == 'cities') User_Session::moveTo(W_ABSPATH . $newUrl . '/cities', 'Редирект со старого урла, страница всех городов ФО', 1);
							else {// Проверяем на конкретный город этого ФО
								$objCity = new City();
								$objCity->find('first', array('joins' => 'INNER JOIN `federal_district` USING(`ID_federal_district`)','conditions' => "`city`.`city_url`='" . $this->arrRequest[1] . "' AND `federal_district`.`federal_district_url`='" . $newUrl . "'"));
								if($objCity->id) User_Session::moveTo(W_ABSPATH . $newUrl . '/' . $objCity->getField('city_url'), 'Редирект со старого урла, страница конкретного города ФО', 1);
							}
						}
					}
				
				// Обработка новых(кортких) урлов федеральных окургов
				$objFederalDistrict = new FederalDistrict();
				$objFederalDistrict->find('first', array('conditions' => "`federal_district`.`federal_district_url`='" . $this->arrRequest[0] . "'"));
				
				if(!$objFederalDistrict->id) throw new Exception_SiteError('', 404);
				elseif(!$this->arrRequest[1]) $this->actionOne($objFederalDistrict);	// Страница конкретного федерального округа
				elseif($this->arrRequest[1] == 'cities') $this->actionAllCities($objFederalDistrict);	// Страница всех гордов конкретного федерального округа
				else { // Проверяем на конкретный город или область этого ФО
					$objCity = new City();
					$objCity->find('first', array('joins' => 'INNER JOIN `federal_district` USING(`ID_federal_district`)','conditions' => "`city`.`city_url`='" . $this->arrRequest[1] . "' AND `federal_district`.`federal_district_url`='" . $objFederalDistrict->getField('federal_district_url') . "'"));
					if($objCity->id) $this->actionCityPage($objCity, $objFederalDistrict); // Страница конкретного города федерального округа
					else {
						$objRegion = new Region();
						$objRegion->find('first', array('joins' => 'INNER JOIN `federal_district` USING(`ID_federal_district`)','conditions' => "`region`.`region_url`='" . $this->arrRequest[1] . "' AND `federal_district`.`federal_district_url`='" . $objFederalDistrict->getField('federal_district_url') . "'"));
						if($objRegion->id) $this->actionRegionPage($objRegion, $objFederalDistrict); // Страница конкретного региона федерального округа
						else throw new Exception_SiteError('', 404);
					}
				}
		}
	}


	/**
	 * Страница списка федеральных округов
	 *
	 */
	public function actionList() {
		Service_Debug::setDebug();
		$objFederalDistrict = new FederalDistrict();
		$arrFederalDistricts = $objFederalDistrict->find('all', array('select' => '`federal_district`.`ID_federal_district`, `federal_district`.`federal_district_name`, `federal_district`.`federal_district_url`', 'order' => '`federal_district`.`importance_level` DESC'));
		
		// Получаем объект статьи с данными текущей страницы(Название, title, description, keywords)
		$objArtcile = new Article(2);
		if(SimpleAdministration::isAdmin()) $this->editUrl =   W_ADMIN . 'articles/edit/' . $objArtcile->id;
		
		$this->addCrumb('Направления перевозок', W_ABSPATH . 'directions');
		$this->title = $objArtcile->getField('title');
		$this->description = $objArtcile->getField('description');
		$this->keywords = $objArtcile->getField('keywords');
		$this->pageHead = $objArtcile->getField('article_name');
		
		$objViewDirection = new View_Direction();
		
		$this->showHeader();
			$objViewDirection->showAdminList(&$arrFederalDistricts, $objArtcile->getFIeld('text'));
		$this->showFooter();
		
	}
	
	/**
	* Выводит главную страницу Федерального округа
	*
	* @param FederalDistrict $objFederalDistrict - объект ФО
	*/
	public function actionOne($objFederalDistrict) {
		Service_Debug::setDebug();
		
		// Массив популярных городов ФО
		$citiesArray = Service_ArrayConverter::sortArray($objFederalDistrict->getMainCities(), 'city_name');
		// Массив областей ФО
		$regionsArray =  $objFederalDistrict->find('all', array('select' => '`region`.`region_url`,`region`.`region_name`', 'joins' => 'INNER JOIN `region` USING(`ID_federal_district`)', 'conditions' => "`federal_district`.`ID_federal_district`='" . $objFederalDistrict->id . "'"));
		
		$this->addCrumb('Направления перевозок', W_ABSPATH . 'directions');
		$this->addCrumb('Грузоперевозки ' . Service_Declination::getGenitive(str_replace('федеральный округ', 'ФО', $objFederalDistrict->getField('federal_district_name'))), W_ABSPATH . $objFederalDistrict->getField('federal_district_url'));
		
		$this->title = 'Грузоперевозки ' . Service_Declination::getGenitive($objFederalDistrict->getField('federal_district_name'));
		$this->keywords = Service_TextMaker::getDirectionKeywords($objFederalDistrict->getField('federal_district_name'), $objFederalDistrict->id);
		$this->description = Service_TextMaker::getFODescription($objFederalDistrict);
		$this->bodyAttrs = 'class="fo-page"';
		$objViewDirection = new View_Direction();
		
		$this->showHeader();
			$objViewDirection->showFederalDistrictPage($objFederalDistrict, &$regionsArray, &$citiesArray);
		$this->showFooter();
	
	}

	/**
	 * Страница всех городов Федерального округа
	 * 
	 * @param FederalDistrict $objFederalDistrict - объект Федерального округа
	 */
	public function actionAllCities($objFederalDistrict) {
		Service_Debug::setDebug();
		$citiesArray = $objFederalDistrict->getAllCities();
		
		
		$this->addCrumb('Направления перевозок', W_ABSPATH . 'directions');
		$this->addCrumb('Грузоперевозки ' . Service_Declination::getGenitive(str_replace('федеральный округ', 'ФО', $objFederalDistrict->getField('federal_district_name'))), W_ABSPATH . $objFederalDistrict->getField('federal_district_url'));
		$this->addCrumb('Города', W_ABSPATH . $objFederalDistrict->getField('federal_district_url') . '/cities');
	  	$this->title = 'Грузоперевозки в городах ' . Service_Declination::getGenitive($objFederalDistrict->getField('federal_district_name'));
	  	$objViewDirection = new View_Direction();
	  	
	  	$this->showHeader();
	    $objViewDirection->showFederalDistrictCities($objFederalDistrict, &$citiesArray);
		$this->showFooter();
	}

	/**
	 * Страница конкретного города
	 * @param array $arrMainCities - массив популярных городов для текущего города
	 * @param City $objCity - объект города
	 */
	public function actionCityPage($objCity, $objFederalDistrict) {
		Service_Debug::setDebug();
		$objViewDirection = new View_Direction();
		
		$this->addCrumb('Направления перевозок', W_ABSPATH . 'directions');
		$this->addCrumb(str_replace('федеральный округ', 'ФО', $objFederalDistrict->getField('federal_district_name')), W_ABSPATH . $objFederalDistrict->getField('federal_district_url'));
		$this->addCrumb('Грузоперевозки ' . Service_Declination::getGenitive($objCity->getField('city_name')), W_ABSPATH . $objFederalDistrict->getField('federal_district_url') . '/' . $objCity->getField('city_url'));
		
		$this->bodyAttrs = 'class="city-page"';
		$this->keywords = Service_TextMaker::getDirectionKeywords($objCity->getField('city_name'), $objCity->id);
		$this->description = Service_TextMaker::getCityDescription($objCity);
		$this->title = $objViewDirection->getOneCityTitle($objCity);
		
		$objViewDirection = new View_Direction();
		$this->showHeader();
		 $objViewDirection->showCityPage($objCity, $objFederalDistrict);
		$this->showFooter();
	}
	
	/**
	 * Страница маршрута
	 * @param array $routeArray - массив составляющих маршрута
	 * @param array $citiesArray - массив двух городов маршрута.
	 */
	public function actionRoutePage($routeArray, $citiesArray) {
		Service_Debug::setDebug();
		
		$this->addCrumb('Грузоперевозки ' . $citiesArray[0]['city_name'] . '-' . $citiesArray[1]['city_name'], W_ABSPATH . 'routes/' . $citiesArray[0]['city_url'] . '-' . $citiesArray[1]['city_url']);
		
		$objViewDirection = new View_Direction();
		$this->title = $objViewDirection->getRouteTitle($citiesArray[0], $citiesArray[1]);
		$this->keywords = Service_TextMaker::getRouteKeywords($citiesArray[0], $citiesArray[1]);
		$this->description = Service_TextMaker::getRouteDescription($citiesArray[0], $citiesArray[1]);
		$this->bodyAttrs = 'class="route-page"';
	
		$this->showHeader();
		$objViewDirection->showRoutePage(&$routeArray, &$citiesArray);
		$this->showFooter();
	}
	
	/**
	 * Страница Региона ФО
	 * 
	 * @param Region $objRegion	- объект Региона
	 * @param FederalDistrict $objFederalDistrict - объект Федерального округа
	 */
	public function actionRegionPage($objRegion, $objFederalDistrict) {
		Service_Debug::setDebug();
		
		$this->addCrumb('Направления перевозок', W_ABSPATH . 'directions');
		$this->addCrumb(str_replace('федеральный округ', 'ФО', $objFederalDistrict->getField('federal_district_name')), W_ABSPATH . $objFederalDistrict->getField('federal_district_url'));
		$this->addCrumb('Грузоперевозки ' . Service_Declination::getGenitive($objRegion->getField('region_name')), W_ABSPATH . $objFederalDistrict->getField('federal_district_url') . '/' . $objRegion->getField('region_url'));
		
		$this->title = 'Грузоперевозки в городах ' . Service_Declination::getGenitive($objRegion->getField('region_name'));
		$this->keywords = Service_TextMaker::getDirectionKeywords($objRegion->getField('region_name'), $objRegion->id);
		$this->description = Service_TextMaker::getRegionDescription($objRegion);
		$this->bodyAttrs = 'class="region-page"';
		
		$objViewDirection = new View_Direction();
		$this->showHeader();
			$objViewDirection->showRegionPage($objRegion, $objFederalDistrict);
		$this->showFooter();
	}
}
?>